/**
 * 抽奖结果相关数据传输对象
 * 对应数据库表: BBL_PRIZE_RESULT
 */

import { BblPrizeResult } from "../entity/prize.result.entity";

/**
 * 抽奖码使用状态映射
 * 键为数据库存储的状态值，值为显示文本
 */
export const LOTTERY_CODE_STATUS_MAP = {
  0: "未使用",
  1: "已使用"
};

/**
 * 根据抽奖码状态值获取对应的显示文本
 * @param status 抽奖码状态（0-未使用，1-已使用）
 * @returns 翻译后的状态文本，未知状态返回格式化字符串
 */
export function getLotteryCodeStatusText(status: number): string {
  return LOTTERY_CODE_STATUS_MAP[status] || `未知状态(${status})`;
}

/**
 * 抽奖结果创建传输对象
 * 用于前端向服务端传递创建抽奖结果的必要信息
 */
export class PrizeResultCreateDto {
  /** 抽奖活动批次ID，关联活动批次表的主键 */
  activityBatchId: string;

  /** 奖品分配映射，键为奖品ID，值为分配权重 */
  prizeDistribution: Record<string, number>;
}

/**
 * 抽奖结果兑奖传输对象
 * 用于前端向服务端传递兑奖信息
 */
export class PrizeResultRedeemDto {
  /** 抽奖码，唯一标识一个抽奖结果 */
  lotteryCode: string;

  /** 兑奖人姓名 */
  winnerName: string;

  /** 联系电话 */
  contactPhone: string;

  /** 邮寄地址，实物奖品需要 */
  mailingAddress?: string;

  /** 邮政编码，实物奖品可选 */
  postcode?: string;
}

/**
 * 抽奖结果列表查询传输对象
 * 用于前端向服务端传递抽奖结果的筛选条件
 */
export class PrizeResultListQueryDto {
  /** 抽奖活动批次ID，可选字段 */
  activityBatchId?: string;

  /** 奖品ID，可选字段 */
  prizeId?: string;

  /** 奖品组ID，可选字段 */
  prizeGroupId?: string;

  /**是否派件，0-未发送，1-已发送 */
  isShipped?: number;

  /** 活动批次关联的奖品组ID，可选字段 */
  activityPrizeGroupId?: string;

  /** 抽奖码，可选字段，支持精确查询 */
  lotteryCode?: string;

  /** 使用状态（0-未使用，1-已使用），可选字段 */
  isUsed?: number;

  /** 兑奖人姓名，可选字段，支持模糊查询 */
  winnerName?: string;
}

/**
 * 抽奖结果分页查询传输对象
 * 继承列表查询条件并添加分页参数
 */
export class PrizeResultPageQueryDto extends PrizeResultListQueryDto {
  /** 每页显示数量，字符串类型（前端传递时通常为字符串） */
  pageSize: string;

  /** 当前页码，字符串类型（前端传递时通常为字符串） */
  current: string;
}

/**
 * 抽奖结果列表传输对象
 * 用于服务端向前端返回抽奖结果列表的简化数据结构
 */
export class PrizeResultListDto {
  constructor(result: BblPrizeResult) {
    this.id = result.id;
    this.lotteryCode = result.lotteryCode;
    this.isUsed = result.isUsed;
    this.isUsedText = getLotteryCodeStatusText(result.isUsed);
    this.useTime = result.useTime ? result.useTime.getTime() : null;
    this.winnerName = result.winnerName;
    this.contactPhone = result.contactPhone;
    this.mailingAddress = result.mailingAddress;
    this.postcode = result.postcode;
    this.createdAt = result.createdAt.getTime();

    // 物流相关信息
    this.isShipped = result.isShipped;
    this.isShippedText = result.isShipped === 1 ? "已发送" : "未发送";
    this.shippingCarrier = result.shippingCarrier;
    this.trackingNumber = result.trackingNumber;

    // 快递单号附件
    this.trackingAttachmentId = result.trackingAttachment?.attId;
    this.trackingAttachmentUrl = result.trackingAttachment?.attPath;

    // 关联对象处理
    this.qrCodeUrl = result.qrCode?.attPath;
    this.qrCodeId = result.qrCode?.attId;

    this.prizeName = result.prize?.prizeName;
    this.prizeId = result.prize?.id;

    // 奖品组相关信息
    this.prizeGroupId = result.prize?.prizeGroup?.id;
    this.prizeGroupName = result.prize?.prizeGroup?.name;
    this.prizeGroupStartTime = result.prize?.prizeGroup?.startTime
      ? result.prize?.prizeGroup?.startTime.getTime()
      : null;
    this.prizeGroupEndTime = result.prize?.prizeGroup?.endTime
      ? result.prize?.prizeGroup?.endTime.getTime()
      : null;

    this.activityBatchName = result.activityBatch?.batchName;
    this.activityBatchId = result.activityBatch?.id;
  }

  /** 抽奖结果主键ID */
  id: string;

  /** 抽奖码，唯一标识一个抽奖结果 */
  lotteryCode: string;

  /** 是否已使用（0-未使用，1-已使用） */
  isUsed: number;

  /** 使用状态文本 */
  isUsedText: string;

  /** 使用时间戳（毫秒），未使用时为null */
  useTime: number | null;

  /** 兑奖人姓名 */
  winnerName: string;

  /** 联系电话 */
  contactPhone: string;

  /** 邮寄地址 */
  mailingAddress: string;

  /** 邮政编码 */
  postcode: string;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 二维码ID */
  qrCodeId: string;

  /** 二维码附件 */
  qrCodeUrl: string;

  /** 奖品ID */
  prizeId?: string;

  /** 奖品名称 */
  prizeName?: string;

  /** 奖品所属奖品组ID */
  prizeGroupId?: string;

  /** 奖品所属奖品组名称 */
  prizeGroupName?: string;

  /** 奖品所属奖品组开始时间 */
  prizeGroupStartTime?: number | null;

  /** 奖品所属奖品组结束时间 */
  prizeGroupEndTime?: number | null;

  /** 活动批次ID */
  activityBatchId?: string;

  /** 活动批次名称 */
  activityBatchName?: string;

  /** 是否发送奖品（0-未发送，1-已发送） */
  isShipped: number;

  /** 是否发送奖品文本 */
  isShippedText: string;

  /** 快递类型 */
  shippingCarrier: string;

  /** 快递单号 */
  trackingNumber: string;

  /** 快递单号附件ID */
  trackingAttachmentId?: string;

  /** 快递单号附件 */
  trackingAttachmentUrl?: string;
}

/**
 * 抽奖结果详情传输对象
 * 用于服务端向前端返回抽奖结果的完整详细信息
 */
export class PrizeResultInfoDto {
  constructor(result: BblPrizeResult) {
    this.id = result.id;
    this.lotteryCode = result.lotteryCode;
    this.isUsed = result.isUsed;
    this.isUsedText = getLotteryCodeStatusText(result.isUsed);
    this.useTime = result.useTime ? result.useTime.getTime() : null;
    this.winnerName = result.winnerName;
    this.contactPhone = result.contactPhone;
    this.mailingAddress = result.mailingAddress;
    this.postcode = result.postcode;
    this.createdAt = result.createdAt.getTime();
    this.updatedAt = result.updatedAt ? result.updatedAt.getTime() : null;

    // 物流相关信息
    this.isShipped = result.isShipped;
    this.isShippedText = result.isShipped === 1 ? "已发送" : "未发送";
    this.shippingCarrier = result.shippingCarrier;
    this.trackingNumber = result.trackingNumber;

    // 快递单号附件
    this.trackingAttachmentId = result.trackingAttachment?.attId;
    this.trackingAttachmentUrl = result.trackingAttachment?.attPath;

    // 关联对象处理
    this.qrCodeUrl = result.qrCode?.attPath;
    this.qrCodeId = result.qrCode?.attId;

    this.prizeName = result.prize?.prizeName;
    this.prizeId = result.prize?.id;
    this.prizeImgUrl = result.prize?.prizeImage?.attPath;

    // 奖品组相关信息
    this.prizeGroupId = result.prize?.prizeGroup?.id;
    this.prizeGroupName = result.prize?.prizeGroup?.name;
    this.prizeGroupStartTime = result.prize?.prizeGroup?.startTime
      ? result.prize?.prizeGroup?.startTime.getTime()
      : null;
    this.prizeGroupEndTime = result.prize?.prizeGroup?.endTime
      ? result.prize?.prizeGroup?.endTime.getTime()
      : null;

    this.activityBatchName = result.activityBatch?.batchName;
    this.activityBatchId = result.activityBatch?.id;
  }

  /** 抽奖结果主键ID */
  id: string;

  /** 抽奖码，唯一标识一个抽奖结果 */
  lotteryCode: string;

  /** 是否已使用（0-未使用，1-已使用） */
  isUsed: number;

  /** 使用状态文本 */
  isUsedText: string;

  /** 使用时间戳（毫秒），未使用时为null */
  useTime: number | null;

  /** 兑奖人姓名 */
  winnerName: string;

  /** 联系电话 */
  contactPhone: string;

  /** 邮寄地址 */
  mailingAddress: string;

  /** 邮政编码 */
  postcode: string;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 更新时间戳（毫秒），未更新时为null */
  updatedAt: number | null;

  /** 是否发送奖品（0-未发送，1-已发送） */
  isShipped: number;

  /** 是否发送奖品文本 */
  isShippedText: string;

  /** 快递类型 */
  shippingCarrier: string;

  /** 快递单号 */
  trackingNumber: string;

  /** 快递单号附件ID */
  trackingAttachmentId?: string;

  /** 快递单号附件URL */
  trackingAttachmentUrl?: string;

  // 二维码扁平化字段
  /** 二维码附件ID */
  qrCodeId?: string;

  /** 二维码URL */
  qrCodeUrl?: string;

  // 奖品扁平化字段
  /** 奖品ID */
  prizeId?: string;

  /** 奖品名称 */
  prizeName?: string;

  /** 奖品图片URL */
  prizeImgUrl?: string;

  // 奖品组扁平化字段
  /** 奖品所属奖品组ID */
  prizeGroupId?: string;

  /** 奖品所属奖品组名称 */
  prizeGroupName?: string;

  /** 奖品所属奖品组开始时间 */
  prizeGroupStartTime?: number | null;

  /** 奖品所属奖品组结束时间 */
  prizeGroupEndTime?: number | null;

  // 活动批次扁平化字段
  /** 活动批次ID */
  activityBatchId?: string;

  /** 活动批次名称 */
  activityBatchName?: string;

  /** 活动开始时间 */
  activityStartTime?: number;

  /** 活动结束时间 */
  activityEndTime?: number;

  /** 活动状态 */
  activityStatus?: number;
}

/**
 * 获取抽奖码状态列表（label-value格式）
 * @returns 包含所有抽奖码状态的数组，每个元素包含label和value字段
 */
export function getLotteryCodeStatusOptions() {
  return Object.entries(LOTTERY_CODE_STATUS_MAP).map(([value, label]) => ({
    value: Number(value),
    label
  }));
}

/**
 * 批量生成抽奖码响应对象
 * 用于服务端向前端返回批量生成抽奖码的结果
 */
export class BatchGenerateResultDto {
  /** 成功生成的抽奖码总数量 */
  totalCount: number;

  /** 活动批次ID */
  activityBatchId: string;

  /** 活动批次名称 */
  activityBatchName: string;

  /** 各奖品生成详情 */
  details: PrizeGenerateDetail[];
}

/**
 * 验证抽奖码响应对象
 * 用于服务端向前端返回验证抽奖码的结果
 */
export class VerifyLotteryCodeDto {
  /** 验证结果，true表示有效，false表示无效 */
  valid: boolean;

  /** 抽奖码状态，0-未使用，1-已使用 */
  status?: number;

  /** 抽奖结果详情，仅当valid为true时返回 */
  result?: PrizeResultInfoDto;

  /** 错误消息，当valid为false时返回 */
  message?: string;
}

/**
 * 提交兑奖人信息传输对象
 * 用于前端向服务端提交兑奖人基本信息（不兑奖的情况下）
 */
export class PrizeWinnerInfoDto {
  /** 抽奖码，唯一标识一个抽奖结果 */
  lotteryCode: string;

  /** 兑奖人姓名 */
  winnerName: string;

  /** 联系电话 */
  contactPhone: string;

  /** 邮寄地址，实物奖品需要 */
  mailingAddress?: string;

  /** 邮政编码，实物奖品可选 */
  postcode?: string;
}

/**
 * 物流信息更新传输对象
 * 用于更新抽奖结果的物流相关信息
 */
export class ShippingUpdateDto {
  /** 抽奖结果ID */
  resultId: string;

  /** 快递类型（如：顺丰、圆通、申通等） */
  shippingCarrier?: string;

  /** 快递单号 */
  trackingNumber?: string;

  /** 快递单号附件ID */
  trackingAttachmentId?: string;
}

/**
 * 批量生成结果详情
 * 记录每种奖品生成的数量
 */
export interface PrizeGenerateDetail {
  /** 奖品ID */
  prizeId: string;

  /** 奖品名称 */
  prizeName: string;

  /** 生成数量 */
  count: number;

  /** 权重占比 */
  weight: number;
}
